// 1.配置base url 超时时间
//2.请求拦截
//3.响应拦截
//4配置进度条
//显示 隐藏
import axios from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'
import { getToken, clearAuth } from '@/utils/auth'


const service = axios.create({
    baseURL: '/api',
    timeout: 5000
})

//请求拦截
service.interceptors.request.use(config => {
    //开启进度条
    NProgress.start();
    
    // 不需要token的请求路径
    const publicPaths = ['/user/code/', '/user/register/', '/user/login/'];

    if (!publicPaths.includes(config.url)) {
        // 获取token并添加到请求头
        const token = getToken();
        if (token) {
            config.headers['Authorization'] = 'Bearer ' + token;
        }
    }
    
    return config;
}, error => {
    // 请求错误处理
    NProgress.done();
    return Promise.reject(error);
})
// 响应拦截
service.interceptors.response.use(res => {
    //关闭进度条
    NProgress.done();
    // 返回响应数据
    return res.data;
}, err => {
    //关闭进度条
    NProgress.done();
    
    // 处理token过期或无效的情况
    if (err.response && err.response.status === 401) {
        clearAuth('登录已过期，请重新登录');
        return Promise.reject(err);
    }
    
    // 处理其他错误状态码
    if (err.response) {
        switch (err.response.status) {
            case 403:
                ElMessage.error('没有权限访问该资源');
                break;
            case 404:
                ElMessage.error('请求的资源不存在');
                break;
            case 500:
                ElMessage.error('服务器内部错误');
                break;
            default:
                ElMessage.error(err.response.data?.msg || '请求失败');
        }
    } else if (err.request) {
        // 网络错误
        ElMessage.error('网络连接失败，请检查网络设置');
    } else {
        // 其他错误
        ElMessage.error('请求配置错误');
    }
    
    // 返回一个带有错误信息的Promise，用于后续处理
    return Promise.reject(err)
})

export default service